home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / os2 / xdsn217.zip / SAMPLES / MAND / mand.mod < prev    next >
Text File  |  1996-07-09  |  20KB  |  690 lines

  1. (**********************************************************************)
  2. (*                                                                    *)
  3. (*                     xTech Development System                       *)
  4. (*                    Native XDS-x86 OS/2 Edition                     *)
  5. (*                                                                    *)
  6. (*      Mandelbrodt Set Explorer for OS/2 Presentation Manager        *)
  7. (*                                                                    *)
  8. (*  Mand.mod - main source file                                       *)
  9. (*                                                                    *)
  10. (*  Make:                                                             *)
  11. (*      xc =p mand.prj                                                *)
  12. (*      rc mand.res mand.exe                                          *)
  13. (*                                                                    *)
  14. (*  Control:                                                          *)
  15. (*      Left mouse button - 2x magnification                          *)
  16. (*      Right mouse button - 4x magnification                         *)
  17. (*                                                                    *)
  18. (*  Copyright (C) 1996 xTech ltd                                      *)
  19. (*                                                                    *)
  20. (**********************************************************************)
  21.  
  22. MODULE Mand;
  23.  
  24. IMPORT FormStr, Storage, SYSTEM;
  25. IMPORT O:=OS2;
  26. FROM SYSTEM IMPORT ADR, ADDRESS, CAST, CARD8, REF, FILL;
  27.  
  28. CONST MAINCLASSNAME = "MandelbrodtSet";
  29.  
  30.       RES_MAIN      = 17;
  31.  
  32.       REFRESH_ITEM  = 17;
  33.       COPY_ITEM     = 2;
  34.       BACK_ITEM     = 3;
  35.       FORWARD_ITEM  = 4;
  36.  
  37.       MSG_UPDATE    = O.WM_USER+1000;
  38.       MSG_DONE      = O.WM_USER+1001;
  39.       MSG_MENUSTATE = O.WM_USER+1002;
  40.       --MSG_TITLE     = O.WM_USER+1003;
  41.       MSG_BUILD     = O.WM_USER+1004;
  42.  
  43. VAR  hAB                     :O.HAB;
  44.      hMainFrame, hMainClient :O.HWND;
  45.  
  46.      tidCntThread            :O.TID;
  47.      nRecalc                 :INTEGER;
  48.      perc, prevperc          :CARDINAL;
  49.      ulTimerId               :CARDINAL;
  50.  
  51. (** Macros from OS2.H are expected  **)
  52.  
  53. PROCEDURE CARD2FROMMP (mp: O.MPARAM): CARDINAL;
  54. BEGIN
  55.   RETURN VAL (CARDINAL, CAST(SYSTEM.CARD16, SYSTEM.SHIFT(CAST(BITSET,mp),-16)) );
  56. END CARD2FROMMP;
  57.  
  58. PROCEDURE CARD1FROMMP(mp: O.MPARAM): CARDINAL;
  59. BEGIN
  60.   RETURN VAL (CARDINAL, CAST (SYSTEM.CARD16, mp) );
  61. END CARD1FROMMP;
  62.  
  63. PROCEDURE CARDFROMMP(mp: O.MPARAM): CARDINAL;
  64. BEGIN
  65.   RETURN CAST (CARDINAL, mp );
  66. END CARDFROMMP;
  67.  
  68. PROCEDURE MPFROMCARD(c :CARDINAL) :O.MPARAM;
  69. BEGIN
  70.   RETURN CAST(O.MPARAM, c);
  71. END MPFROMCARD;
  72.  
  73. PROCEDURE MPFROM2CARD(c1,c2 :CARDINAL) :O.MPARAM;
  74. BEGIN
  75.   RETURN
  76.   CAST(O.MPARAM,
  77.        CAST(SYSTEM.CARD32, SYSTEM.SHIFT(BITSET(c2), 16))+
  78.        CAST(SYSTEM.CARD16, c1)
  79.       );
  80. END MPFROM2CARD;
  81.  
  82. PROCEDURE MPFROMP(p :ADDRESS) :O.MPARAM;
  83. BEGIN
  84.   RETURN CAST(O.MPARAM, p);
  85. END MPFROMP;
  86.  
  87.  
  88. PROCEDURE MyEnableMenuItem(hwndMenu :O.HWND; usId :CARDINAL; fEnable :BOOLEAN);
  89. VAR c :CARDINAL;
  90. BEGIN
  91.   IF fEnable
  92.    THEN c:= 0;
  93.    ELSE c:= O.MIA_DISABLED;
  94.   END;
  95.  
  96.   O.WinSendMsg(hwndMenu, O.MM_SETITEMATTR,
  97.                MPFROM2CARD(usId, 1),
  98.                MPFROM2CARD(O.MIA_DISABLED, c)
  99.               );
  100.  
  101. END MyEnableMenuItem;
  102.  
  103.  
  104.  
  105.  
  106. (*-------------------------- Abstract data types -----------------------------*)
  107.  
  108. (** Bit-map info structure **)
  109.  
  110. MODULE BI;
  111.  
  112. FROM O      IMPORT BITMAPINFO2, PBITMAPINFO2, RGB2;
  113. IMPORT ADR, ADDRESS, CARD8, REF, FILL;
  114.  
  115. EXPORT QUALIFIED Setsz, bi;
  116.  
  117.  
  118. TYPE  BIS = RECORD
  119.         h   : BITMAPINFO2;
  120.         clr : ARRAY [1..255] OF RGB2;
  121.       END;
  122.  
  123. VAR   bi      :BIS;
  124.       i       :CARDINAL;
  125.  
  126. PROCEDURE Setsz(cx, cy :CARDINAL);
  127. BEGIN
  128.   bi.h.cx := cx;
  129.   bi.h.cy := cy;
  130. END Setsz;
  131.  
  132. -- Type constructor
  133.  
  134. BEGIN
  135.  
  136.   FILL(ADR(bi), 0, SIZE(BIS) );
  137.   bi.h.cbFix     := SIZE(BITMAPINFO2)-SIZE(RGB2);
  138.   bi.h.cPlanes   := 1;
  139.   bi.h.cBitCount := 8;
  140.  
  141.   FOR i:=0 TO 254 DO
  142.    bi.clr[i].bRed     := VAL (CARD8, i MOD 16 * 16);
  143.    bi.clr[i].bGreen   := VAL (CARD8, (i DIV 8 MOD 8) * 32);
  144.    bi.clr[i].bBlue    := VAL (CARD8, (i DIV 32) * 32);
  145.   END;
  146.  
  147. END BI;
  148.  
  149. (** Mandel info data type **)
  150.  
  151. MODULE MI;
  152.  
  153. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  154. FROM O IMPORT DosFreeMem;
  155. IMPORT CARD8, ADDRESS;
  156.  
  157. EXPORT MANDINFO, PMANDINFO, MINew, MIDel;
  158.  
  159. CONST START_X0 = -3.0;
  160.       START_Y0 = -2.3;
  161.       START_X1 =  2.0;
  162.       START_Y1 =  2.2;
  163.  
  164. TYPE
  165.       MANDINFO = RECORD
  166.                   MX0,MY0,MX1,MY1 :LONGREAL; -- Mandelbrodt parms
  167.                   Bcx,Bcy         :CARDINAL; -- current bit-map sizes (=curr client rgn sizes)
  168.                   pMBitmap        :ADDRESS;  -- bit-map image
  169.                  END;
  170.  
  171.       PMANDINFO = POINTER TO MANDINFO;
  172.  
  173.  
  174. PROCEDURE MINew(VAR pminfo :PMANDINFO; pmsrc :PMANDINFO);
  175. BEGIN
  176.   ALLOCATE( pminfo, SIZE(MANDINFO) );
  177.  
  178.   IF pmsrc=NIL
  179.    THEN pminfo^.MX0 := START_X0;
  180.         pminfo^.MY0 := START_Y0;
  181.         pminfo^.MX1 := START_X1;
  182.         pminfo^.MY1 := START_Y1;
  183.    ELSE pminfo^ := pmsrc^;
  184.   END;
  185.  
  186.   pminfo^.pMBitmap := NIL;
  187. END MINew;
  188.  
  189.  
  190. PROCEDURE MIDel(pminfo :PMANDINFO);
  191. BEGIN
  192.   IF pminfo^.pMBitmap # NIL THEN DosFreeMem(pminfo^.pMBitmap); END;
  193.   DEALLOCATE( pminfo, SIZE(MANDINFO) );
  194. END MIDel;
  195.  
  196. END MI;
  197.  
  198.  
  199. (**    Picture List   **)
  200.  
  201. MODULE PList;
  202.  
  203. IMPORT MANDINFO, PMANDINFO, MINew, MIDel;
  204. FROM Storage IMPORT DEALLOCATE;
  205.  
  206. EXPORT QUALIFIED nCurPic, nPic,       (* READ-ONLY *)
  207.                  Back, Curr, Forw,To,
  208.                  Cut, App, Replace,
  209.                  hzMB,
  210.                  Quit;
  211.  
  212. CONST PnMAX = 100;
  213.  
  214. VAR   nCurPic, nPic :INTEGER;
  215.       aPicList      :ARRAY [0..PnMAX-1] OF PMANDINFO;
  216.  
  217.  
  218. PROCEDURE Back();
  219. BEGIN
  220.   IF nCurPic # 0 THEN  DEC(nCurPic); END;
  221. END Back;
  222.  
  223. PROCEDURE Curr(): PMANDINFO; BEGIN RETURN aPicList[nCurPic]; END Curr;
  224.  
  225. PROCEDURE Forw();
  226. BEGIN
  227.   IF nCurPic+1 # nPic THEN INC(nCurPic); END;
  228. END Forw;
  229.  
  230. PROCEDURE To(n: INTEGER); BEGIN nCurPic:=n; END To;
  231.  
  232.  
  233. PROCEDURE Cut(cpos: INTEGER);
  234.  
  235. VAR i: INTEGER;
  236.  
  237. BEGIN
  238.   (* requires 0 < cpos < nPic *)
  239.  
  240.   FOR i:=cpos TO nPic-1 DO
  241.     MIDel(aPicList[i]);
  242.     aPicList[i] := NIL;
  243.   END;
  244.  
  245.   nCurPic := cpos; nPic := cpos;
  246.   Back();
  247. END Cut;
  248.  
  249. PROCEDURE App(pm :PMANDINFO);
  250. BEGIN
  251.   IF nPic=PnMAX THEN RETURN; END;
  252.   aPicList[nPic] := pm;
  253.   INC(nPic);
  254. END App;
  255.  
  256. PROCEDURE Replace(n :INTEGER; p :PMANDINFO);
  257. BEGIN
  258.   MIDel(aPicList[n]);
  259.   aPicList[n] := p;
  260. END Replace;
  261.  
  262.  
  263. PROCEDURE hzMB():BOOLEAN; BEGIN  RETURN aPicList[0]^.pMBitmap # NIL; END hzMB;
  264.  
  265.  
  266. PROCEDURE Quit();
  267.  
  268. VAR i: INTEGER;
  269.  
  270. BEGIN
  271.   FOR i:=0 TO nPic-1 DO
  272.     DEALLOCATE( aPicList[i], SIZE(MANDINFO) );
  273.   END;
  274.  
  275. END Quit;
  276.  
  277. -- Type constructor
  278. BEGIN
  279.   MINew(aPicList[0], NIL);
  280.   nCurPic := 0;
  281.   nPic   := 1;
  282.  
  283. END PList;
  284.  
  285. (*----------------------------------------------------------------------------*)
  286.  
  287.  
  288. VAR ID :ARRAY [0..2000] OF LONGREAL;
  289.  
  290. (** Mandelbrodt set calculation procedure to execute in the background thread **)
  291.  
  292. PROCEDURE [O.EXPENTRY] CalcSet (c: CARDINAL);
  293.  
  294. (* these types are used only to cast rather than to instantiate *)
  295. CONST UB  = 0ffffffH;
  296. TYPE  PTR  = POINTER TO ARRAY [0..UB]   OF CARD8;
  297.  
  298. VAR x0, y0, x, y, x2, y2 :LONGREAL;
  299.     wb, i, j             :CARDINAL;
  300.     l                    :LONGREAL;
  301.     p                    :CARDINAL;
  302.     n                    :CARDINAL;
  303.     pHuge                :PTR;
  304.     pminfo               :PMANDINFO;
  305.  
  306. BEGIN
  307.  
  308.   pminfo := PMANDINFO(c); (* thread parms passed by DosCreateThread *)
  309.   WITH pminfo^ DO
  310.    IF pMBitmap=NIL THEN RETURN; END;
  311.  
  312.    IF Bcx>Bcy
  313.      THEN j := Bcx;
  314.           l := MX1-MX0;
  315.      ELSE j := Bcy;
  316.           l := MY1-MY0;
  317.    END;
  318.    FOR  i:=0 TO j DO
  319.      ID[i] := l * LFLOAT(i) / LFLOAT(j);
  320.    END;
  321.  
  322.    pHuge := PTR(pMBitmap);
  323.  
  324.    p    := 0;
  325.    wb   := (Bcx + 3) / 4 * 4;
  326.    perc := 0; prevperc := 0;
  327.    O.WinStartTimer(hAB, hMainClient, 0, 200);
  328.  
  329.    FOR j:=1 TO Bcy DO
  330.      y0 := MY0 + ID[j];
  331.      FOR i:=1 TO wb DO
  332.        y